3.1 进程

进程是处于执行期的程序以及相关资源的总称,是正在执行的程序代码的实时结果。除了可执行程序代码外,进程还包含了其它资源:

  • 打开的文件
  • 挂起的信号
  • 内核内部数据
  • 处理器状态
  • 一个或多个具有内存映射的内存地址空间及一个或多个执行线程
  • 存放全局变量的数据段

线程是在进程中活动的对象,每个线程拥有:

  • 一个独立的程序计数器
  • 进程栈
  • 一组进程寄存器

内核调度的对象是线程,不是进程。

传统的Unix系统中一个进程只包含一个线程;对Linux系统而言,线程只不过是一种特殊的进程。

现代操作系统的进程提供两种虚拟机制:

  • 虚拟存储器:让进程觉得自己独享处理器
  • 虚拟内存:让进程觉得自己拥有整个系统的内存资源

Linux系统中通常通过fork()系统调用创建进程,调用fork的进程称为父进程,新生的进程称为子进程。fork系统调用从内核返回两次:一次回到父进程,另一次回到新产生的子进程。

程序通过exit()系统调用退出执行,这个函数会终结进程并将其占用的资源释放掉。

父进程可以通过wait4()系统调用查询子进程是否终结。

进程退出执行后被设置为僵死状态,直到它的父进程调用wait()或waitpid()为止。

3.2 进程描述符及任务结构

内核把进程的列表存放在任务队列(task list,双向循环列表),列表成员都是类型为task_struct的结构体,称为进程描述符(process descriptor),进程描述符包含一个具体进程的所有信息。